package com.atguigu.service.impl;




import com.alibaba.dubbo.config.annotation.Service;
import com.atguigu.bean.Member;
import com.atguigu.bean.Order;
import com.atguigu.bean.OrderSetting;
import com.atguigu.constant.MessageConstant;
import com.atguigu.dao.MemberMapper;
import com.atguigu.dao.OrderMapper;
import com.atguigu.dao.OrderSettingMapper;
import com.atguigu.entity.Result;
import com.atguigu.service.OrderService;
import com.atguigu.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Service(interfaceClass = OrderService.class)
@Transactional
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderSettingMapper orderSettingMapper;
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private OrderMapper orderMapper;

//        1、检查用户所选择的预约日期是否已经提前进行了预约设置，如果没有设置则无法进行预约
//        2、检查用户所选择的预约日期是否已经约满，如果已经约满则无法预约
//        3、检查用户是否重复预约（同一个用户在同一天预约了同一个套餐），如果是重复预约则无法完成再次预约
//        4、检查当前用户是否为会员，如果是会员则直接完成预约，如果不是会员则自动完成注册并进行预约
//        5、预约成功，更新当日的已预约人数
    @Override
    public Result submit(Map map) {
        try {
            //获取页面预约的日期
            String orderDate =(String)map.get("orderDate");
            // 因为数据库预约设置表里面的时间是date类型，http协议传递的是字符串类型，所以需要转换
            Date date = DateUtils.parseString2Date(orderDate);
            OrderSetting orderSetting = orderSettingMapper.findByOrderDate(date);
            //使用预约时间，查询预约设置表，判断是否有该记录
            if (orderSetting == null){
                return new Result(false, MessageConstant.ORDERSETTING_FAIL);
            }else {
                //获取预约日期当天的可预约人数
                int number = orderSetting.getNumber();
                //获取预约日期当天的已预约人数
                int reservations = orderSetting.getReservations();
                //判断预约人数是否已满
                if (reservations >= number){
                    return new Result(false,MessageConstant.ORDER_FULL);
                }
            }
            //获取用户输入的手机号
            String telephone = (String) map.get("telephone");
            // 根据手机号，查询会员表，判断当前预约人是否是会员
            Member member = memberMapper.findByTelephone(telephone);
            //检查用户是否重复预约（同一个用户在同一天预约了同一个套餐）
            if (member != null){
                //是会员，判断是否为重复预约
                Integer memberId = member.getId();
                //获取套餐id
                int setmealId = Integer.parseInt((String) map.get("setmealId"));
                Order order = new Order(memberId,date,null,null,setmealId);
                // 根据预约信息查询是否已经预约
                List<Order> list =  orderMapper.findByCondition(order);
                // 判断是否已经预约list不等于null，说明已经预约，不能重复预约
                if (list != null && list.size()>0){
                    //已经完成了预约，不能重复预约
                    return new Result(false,MessageConstant.HAS_ORDERED);
                }
            }else{
                //不是会员进行注册
                member = new Member();
                member.setName((String)map.get("name"));
                member.setSex((String)map.get("sex"));
                member.setPhoneNumber((String)map.get("telephone"));
                member.setIdCard((String)map.get("idCard"));
                member.setRegTime(new Date());
                memberMapper.add(member);
            }
            //可以进行预约，更新预约人数
            orderSetting.setReservations(orderSetting.getReservations() + 1);
            orderSettingMapper.editReservationsByOrderDate(orderSetting);

            //可以进行预约，更新预约表
            Order order = new Order();
            order.setMemberId(member.getId()); //会员id
            order.setOrderDate(date); // 预约时间
            order.setOrderStatus(Order.ORDERSTATUS_NO); // 预约状态（已到诊/未到诊）
            order.setOrderType((String)map.get("orderType"));
            order.setSetmealId(Integer.parseInt((String)map.get("setmealId")));
            orderMapper.submit(order);
            return new Result(true,MessageConstant.ORDER_SUCCESS,order);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false,MessageConstant.ORDERSETTING_FAIL);
        }
    }

    @Override
    public Map findById(Integer id) {
        Map map = orderMapper.findById(id);
        if (map != null) {
            Date orderDate = (Date) map.get("orderDate");
            try {
                map.put("orderDate",DateUtils.parseDate2String(orderDate));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return map;
    }
}
